// 多了类型的 JavaScript。

// 类型标注的语法，变量:类型
let age: number = 18;

// 复杂类型，对象类型，引用类型
let arr: number[] = [1, 2];
// arr = ['a']
let arr2: Array<string> = ['a', 'b'];

// ｜ 联合类型操作符
let numAdnStr: number | string = 1;
numAdnStr = '1';
// numAdnStr = {}

let numAdnStrArr: (number | string)[] = [1, 2];
numAdnStrArr = ['1'];
numAdnStrArr = ['1', 2];
// numAdnStrArr = [true]

// 当类型太长了，复用不方便了，使用类型别名。
// 给类型定义名称，相当于定义变量，只不过是类型。
type CustomArray = (number | string | boolean)[];

let arr3: CustomArray = [1, 'a', true];

// 约束函数，就是约束函数的：参数，返回值
function add(num1: CustomArray, num2: number): number {
  // return '123'
  return num1.length + num2;
}

// 箭头函数，函数表达式（函数变量），可以使用函数类型别名
type AddFn = (num1: number, num2: number) => number;

const add2: AddFn = (num1, num2) => {
  return num1 + num2;
};

// add2(1,'2')
// 要注意和原生的区别
const add3 = (num1: number, num2: number): void => {
  console.log(num1 + num2);
};

const add4 = (num1: number, num2?: number): void => {
  if (num2 === undefined) return;
  console.log(num1 + num2);
};

export {};
